package EjerciciosFinal.ejerciciosFinal;

public class ListaSimplementeEnlazada<T> implements Lista<T> {

	private NodoSimple<T> primero;

	private int cantidadElementos;

	private IteradorListaSimplementeEnlazada<T> iterador;
	
	public ListaSimplementeEnlazada() {
		this.primero = null;
		this.cantidadElementos = 0;
	}

	public void agregar(T elemento) {
		NodoSimple<T> nuevoNodo = new NodoSimple<T>(elemento);
		nuevoNodo.setSiguiente(null);
		if (this.estaVacia()) {
			this.primero = nuevoNodo;
		} else {
			NodoSimple<T> ultimo = this.getUltimoNodo();
			ultimo.setSiguiente(nuevoNodo);
		}
		this.cantidadElementos++;
	}

	/**
	 * @pre: La Lista NO puede estar vacia.
	 * @post: Devuelve una referencia hacia
	 * el �ltimo nodo.
	 */
	private NodoSimple<T> getUltimoNodo() {
		NodoSimple<T> ultimo = this.primero;
		while (ultimo.getSiguiente() != null) {
			ultimo = ultimo.getSiguiente();
		}
		return ultimo;
	}

	public boolean estaVacia() {
		return (this.primero == null);
	}

	public int longitud() {
		return this.cantidadElementos;
	}

	public T obtener(int posicion) {
		T elemento = null;
		if (posicion < this.longitud()) {
			NodoSimple<T> actual = this.primero;
			for (int i = 0; i < posicion; i++) {
				actual = actual.getSiguiente();
			}
			elemento = actual.getDato();
		}
		return elemento;
	}

	public T remover(int posicion) {
		T elemento = null;
		if (posicion < this.longitud()) {
			NodoSimple<T> aRemover;
			/* distinguimos cuando vamos a remover el primero */
			if (posicion > 0) {
				/* buscamos el nodo anterior al que queremos remover */
				NodoSimple<T> anterior = this.primero;
				for (int i = 0; i < posicion - 1; i++) {
					anterior = anterior.getSiguiente();
				}
				/* reenlaza el anterior y el siguiente */
				aRemover = anterior.getSiguiente();
				anterior.setSiguiente(aRemover.getSiguiente());
			} else {
				/* reenlaza el nuevo primer nodo */
				aRemover = this.primero;
				this.primero = aRemover.getSiguiente();
			}
			elemento = aRemover.getDato();
		}
		return elemento;
	}
	
	public IteradorListaSimplementeEnlazada<T> iterador(){
		 this.iterador = new IteradorListaSimplementeEnlazada<T>(this.primero);
		
		return this.iterador;
	}

	@Override
	public void agregar(int posicion, T elemento) {
		// TODO Auto-generated method stub
		
	}

	public void limpiar() {
		this.primero = null;
	}
	
}
